#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <ctime>
#include <sys/time.h>
#include <assert.h>

// // 非阻塞接口
// bool SetNonBlock(int fd)
// {
//     int fl = fcntl(fd, F_GETFL); // 在底层获取当前fd对应的文件读写标志位
//     if (fl < 0) return false;
//     fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 设置非阻塞
//     return true;
// }

// int main()
// {
//     // 0号描述符  stdin
//     SetNonBlock(0); // 只用设置一次，后续就都是非阻塞了
//     char buffer[1024];
//     while (true)
//     {
//         errno = 0;
//         // 非阻塞的时候，我们是以出错的形式返回，告知上层数据没有就绪
//         // a.我们如何识别是真的出错了
//         // b.还是仅仅是数据没有就绪呢？
//         // 数据就绪的话，我们就正常读取就行
//         ssize_t s = read(0, buffer, sizeof(buffer) - 1); // 出错，不仅仅是错误返回值，error变量也会被设置，表明出错原因
//         if (s > 0)
//         {
//             buffer[s - 1] = 0;
//             std::cout << "echo# " << buffer << " errno[---]]:" << errno << " errstring: " << strerror(errno) << std::endl;
//         }
//         else
//         {
//             // 如果失败的errno值是11，代表其实没错，只不过是底层数据没就绪
//             //std::cout << "read \" error\"  " << " errno:" << errno << " errstring: " << strerror(errno) << std::endl;

//             if (errno == EWOULDBLOCK || errno == EAGAIN)
//             {
//                 std::cout << "当前0号数据没有就绪, 请下一次再来试试" << std::endl;
//                 sleep(1);
//                 continue;
//             }
//             else if (errno == EINTR)
//             {
//                 std::cout << "当前IO可能被信号中断,再试一试" << std::endl;
//                 sleep(1);
//                 continue;
//             }
//             else
//             {
//                 // 出错处理
//                 std::cout << "read \" error\"  " << " errno:" << errno << " errstring: " << strerror(errno) << std::endl;
//             }

//             sleep(1);
//         }
//     }
//     return 0;
// }



// // 认识时间的接口
// int main()
// {
//     while (true)
//     {
//         std::cout << "time: " << (unsigned long)time(nullptr) << std::endl;
//         struct timeval currtime = {0, 0};
//         int n = gettimeofday(&currtime, nullptr);
//         assert(n == 0);
//         (void)n;

//         std::cout << "gettimeofday: " << currtime.tv_sec << "." << currtime.tv_usec << std::endl;
//         sleep(1);
//     }

//     return 0;
// }